/**
 * 注册、登录、注销
 * */
import util from '@/libs/util';
import router from '@/router';
import Setting from '@/setting';
import { AccountLogin,AccountLoginOut, GetMenus, AccountRegister } from '@api/account';

import { Modal } from 'view-ui-plus';

export default {
    namespaced: true,
    state: {
        loginInfo: {} // 登陆信息，用语断线重连
    },
    mutations: {
        SET_LOGIN_INFO: (state, info) => {
            state.loginInfo = info;
        }
    },
    getters: {
        loginInfo: state => {
            return state.loginInfo;
        }
    },
    actions: {
        /**
         * @description 登录
         * @param {Object} context
         * @param username {String} 用户账号
         * @param password {String} 密码
         * @param param route {Object} 登录成功后定向的路由对象 任何 vue-router 支持的格式
         */
        login ({ dispatch }, {
            username = '',
            password = ''
        } = {}) {
            return new Promise((resolve, reject) => {
                // 开始请求登录接口
                AccountLogin({
                    username,
                    password
                })
                    .then(async res => {
                        // 设置 cookie 一定要存 uuid 和 token 两个 cookie
                        // 整个系统依赖这两个数据进行校验和存储
                        // uuid 是用户身份唯一标识 用户注册的时候确定 并且不可改变 不可重复
                        // token 代表用户当前登录状态 建议在网络请求中携带 token
                        // 如有必要 token 需要定时更新，默认保存一天，可在 setting.js 中修改
                        // 如果你的 token 不是通过 cookie 携带，而是普通字段，也可视情况存储在 localStorage
                        util.cookies.set('uuid', res.info.member_id);
                        util.cookies.set('token', res.access_token);
                        localStorage.setItem('userinfo', JSON.stringify(res.info));
                        // 设置 vuex 用户信息
                        await dispatch('admin/user/set', res.info, { root: true });
                        // 用户登录后从持久化数据加载一系列的设置
                        await dispatch('load', { loadOpenedTabs: Setting.page.loadOpenedTabs });
                        // 获取动态菜单
                        if (Setting.dynamicMenu) await dispatch('admin/menu/getMenuList', false, { root: true });
                        // 结束
                        resolve(res);
                    })
                    .catch(err => {
                        reject(err);
                    });
            });
        },
                /**
         * 菜单获取
         */
        //     getmenu({ dispatch }, id) {
        //     return new Promise((resolve, reject) => {
        //         // 开始请求登录接口
        //         GetMenus()
        //             .then(async res => {
        //                 // console.log(res);
        //                 // localStorage.setItem('is_role_kf', res.is_role_kf)
        //                 // localStorage.setItem('is_nurse', res.is_nurse)
        //                 // localStorage.setItem('is_role_yz', res.is_role_yz)
        //                 localStorage.setItem('menus', JSON.stringify(res.auth));
        //                 localStorage.setItem(
        //                     'attr_list',
        //                     JSON.stringify(res.attr_list)
        //                 );
        //                 localStorage.setItem(
        //                     'project',
        //                     JSON.stringify(res.project)
        //                 );
        //                 localStorage.setItem(
        //                     'currentProject',
        //                     res.defaultProjectId
        //                 );
        //                 const filterMenuSider = getMenuSider(
        //                     res.auth.sider,
        //                     res.defaultProjectId
        //                 );
        //                 for (let item of res.auth.action) {
        //                     store.commit('power/power/setEditpower', item);
        //                 }
        //                 localStorage.setItem(
        //                     'poweredit',
        //                     JSON.stringify(store.state.power.power.poweredit)
        //                 );
        //                 store.commit('admin/menu/setHeader', res.auth.header);
        //                 store.commit('admin/menu/setSider', filterMenuSider);
        //                 store.commit('admin/menu/setProject', res.project);
        //                 store.commit(
        //                     'admin/menu/setCurrentProject',
        //                     res.defaultProjectId
        //                 );
        //                 let r = await robotindexwxids();
        //                 localStorage.setItem('wechatInfo', r);
        //                 resolve();
        //             })
        //             .catch(err => {
        //                 reject(err);
        //             });
        //     });
        // },

        /**
         * @description 退出登录
         * */
        logout ({ commit, dispatch }, { confirm = false, vm } = {}) {
            async function logout () {
                // 删除cookie
                util.cookies.remove('token');
                util.cookies.remove('uuid');
                localStorage.clear()
                // 清空 vuex 用户信息                
                await dispatch('admin/user/set', {}, { root: true });
                // 跳转路由
                router.push({
                    name: 'login'
                });
            }

            if (confirm) {
                Modal.confirm({
                    title: vm.$t('basicLayout.logout.confirmTitle'),
                    content: vm.$t('basicLayout.logout.confirmContent'),
                    onOk () {
                        AccountLoginOut().then(()=>{
                            logout();
                        }).catch(()=>{
                            
                        })                        
                    }
                });
            } else {
                AccountLoginOut().then(()=>{
                    logout();
                }).catch(()=>{
                    
                })  
            }
        },
        /**
         * @description 注册
         * @param context {Object}
         * @param mail {String} 邮箱
         * @param password {String} 密码
         * @param mobile {String} 手机号码
         * @param captcha {String} 验证码
         */
        register ({ dispatch }, {
            mail = '',
            password = '',
            mobile = '',
            captcha = ''
        } = {}) {
            return new Promise((resolve, reject) => {
                // 开始请求登录接口
                AccountRegister({
                    mail,
                    password,
                    mobile,
                    captcha
                })
                    .then(async res => {
                        // 注册成功后，完成与登录一致的操作
                        // 注册也可视情况不返还 uuid、token 等数据，在注册完成后，由前端自动执行一次登录逻辑
                        util.cookies.set('uuid', res.uuid);
                        util.cookies.set('token', res.token);
                        // 设置 vuex 用户信息
                        await dispatch('admin/user/set', res.info, { root: true });
                        // 用户登录后从持久化数据加载一系列的设置
                        await dispatch('load');
                        // 结束
                        resolve();
                    })
                    .catch(err => {
                        reject(err);
                    });
            });
        },
        /**
         * @description 用户登录后从持久化数据加载一系列的设置
         * @param {Object} state vuex state
         * @param {Object} dispatch vuex dispatch
         * @param {Object} loadOpenedTabs 是否加载页签信息
         */
        load ({ state, dispatch }, { loadOpenedTabs = true } = {}) {
            return new Promise(async resolve => {
                // 加载用户登录信息
                await dispatch('admin/user/load', null, { root: true });
                // 持久化数据加载上次退出时的多页列表
                await dispatch('admin/page/openedLoad', { loadOpenedTabs }, { root: true });
                // end
                resolve();
            });
        }
    }
};
